package com.ala4.oxcafe.service.impl;

import com.ala4.oxcafe.common.utils.object.ObjectUtil;
import com.ala4.oxcafe.common.utils.text.StrUtil;
import com.ala4.oxcafe.entity.DeptInfo;
import com.ala4.oxcafe.exception.BusinessException;
import com.ala4.oxcafe.repository.DeptInfoRepository;
import com.ala4.oxcafe.service.DeptInfoService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 部门信息
 * @author PING
 * @date 2025/8/12 21:03
 */
@Service
@AllArgsConstructor
public class DeptInfoServiceImpl implements DeptInfoService {

    private DeptInfoRepository deptInfoRepository;

    @Override
    public List<DeptInfo> deptInfoList(DeptInfo deptInfo) {
        LambdaQueryWrapper<DeptInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StrUtil.isNotEmpty(deptInfo.getDeptName()), DeptInfo::getDeptName, deptInfo.getDeptName());
        queryWrapper.eq(ObjectUtil.isNotNull(deptInfo.getStatus()), DeptInfo::getStatus, deptInfo.getStatus());
        return deptInfoRepository.list(queryWrapper);
    }

    @Override
    public DeptInfo createDeptInfo(DeptInfo deptInfo) {
        // 这里的ID需要特殊处理一下 使用父节点增加的方式
        DeptInfo parentDept = deptInfoRepository.getById(deptInfo.getParentId());
        if (ObjectUtil.isNull(parentDept)) {
            throw new BusinessException("父部门不存在");
        }
        // 默认就是父节点后面增加一个001
        String currentId = (ObjectUtil.isNull(parentDept.getParentId()) ? parentDept.getId() : parentDept.getParentId()) + "001";

        // 查询父节点的子节点的最大的ID 这里应该不需要拼接逻辑删除
        Long maxId = deptInfoRepository.getBaseMapper().selectMaxIdDept(deptInfo.getParentId());
        // 如果不为null 就是最大的id增加1
        if (ObjectUtil.isNotNull(maxId)) {
            currentId = String.valueOf(maxId + 1);
        }
        deptInfo.setId(Long.valueOf(currentId));
        deptInfoRepository.save(deptInfo);
        return deptInfo;
    }

    @Override
    public DeptInfo updateDeptInfo(DeptInfo deptInfo) {
        boolean b = deptInfoRepository.updateById(deptInfo);
        if (!b) {
            throw new BusinessException("更新失败");
        }
        return deptInfo;
    }

    @Override
    public void deleteDeptInfo(Long deptId) {

        DeptInfo deptInfo = deptInfoRepository.getById(deptId);
        if (ObjectUtil.isNull(deptInfo)) {
            throw new BusinessException("找不到部门信息");
        }
        // 如果父级节点是NULL 说明是顶级部门 不能删除
        if (ObjectUtil.isNull(deptInfo.getParentId())) {
            throw new BusinessException("顶级部门不能删除");
        }

        // 删除部门
        deptInfoRepository.removeById(deptId);
        // 子部门也要删除
        deptInfoRepository.deleteChildNode(deptId);
    }

    @Override
    public DeptInfo deptInfo(Long deptId) {
        return deptInfoRepository.getById(deptId);
    }
}
